package com.controller;

import com.entity.FileUpLoadResBody;
import com.po.TalkVideo;
import com.service.TalkVideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.UUID;

/**
 * @author WZ
 * @version 1.0
 * @date 2021/8/19 18:04
 */
@Controller
public class FileUpAndDownController {

    @Autowired
    private TalkVideoService talkVideoService;

    @RequestMapping("/testDown")
    public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
        //获取ServletContext对象
        ServletContext servletContext = session.getServletContext();
        //获取服务器中文件的真实路径
        String realPath = servletContext.getRealPath("/static/img/1.jpg");
        //创建输入流
        InputStream is = new FileInputStream(realPath);
        //创建字节数组
        byte[] bytes = new byte[is.available()];
        //将流读到字节数组中
        is.read(bytes);
        //创建HttpHeaders对象设置响应头信息
        MultiValueMap<String, String> headers = new HttpHeaders();
        //设置要下载方式以及下载文件的名字（附件形式 文件名名称1.jpg）
        headers.add("Content-Disposition", "attachment;filename=1.jpg");
        //设置响应状态码
        HttpStatus statusCode = HttpStatus.OK;
        //创建ResponseEntity对象
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
        //关闭输入流
        is.close();
        return responseEntity;
    }
    @PostMapping(value = "/uploadImg")//上传文件的接口可以直接用是
    @ResponseBody//  需要返回成功信息 和 finalPath  再修改一下updateKiaRa接口 返回和接受 图片url
    @CrossOrigin
    public FileUpLoadResBody testUP(Integer animeId,String name,MultipartFile file, HttpSession session, HttpServletRequest request , HttpServletResponse response) throws IOException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
        //获取上传的文件的文件名
        String filename = file.getOriginalFilename();
        //获得文件后缀
        String suffixName=filename.substring(filename.lastIndexOf("."));
        //将UUID作为文件
//        synchronized (uuid){
//            //循环的时候记得加锁哦
//        }
        String uuid= UUID.randomUUID().toString().replaceAll("-","");
        //将uuid和文件后缀拼接 作为最终文件名
        filename=uuid+suffixName;
        //通过ServletContext获取服务器中photo目录的路径
        ServletContext servletContext=session.getServletContext();
        String photoPath=servletContext.getRealPath("file");
        File file2=new File(photoPath);
        //判断photo所对应的路径是否存在
        if(!file2.exists()){
            //若不存在，啧创建目录
            file2.mkdir();
        }
        String finalPath=photoPath+File.separator+filename;
        file.transferTo(new File(finalPath));
        //http://47.106.124.209:8080/springMVC-demo3-1.0-SNAPSHOT/photo/fbdf0c1cd4614ff3a945748abbf3f0a7.png
      String host=request.getServerName();
        String port= String.valueOf(request.getServerPort());
        String finalPath2="http://"+host+":"+port+servletContext.getContextPath()+"/file/"+filename;
        long currenttime=System.currentTimeMillis();
        String date1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(currenttime);
        TalkVideo talkVideo=new TalkVideo();
        talkVideo.setAnimeId(animeId);
        talkVideo.setName(name);
        talkVideo.setUrl(finalPath2);
        talkVideoService.save(talkVideo);

        return new  FileUpLoadResBody("200","成功",date1,finalPath2);
    }
}
